试验了一下,对无主键表更新不能成功,添加删除没问题
public class SsSysIpFilter implements Serializable
{
/**
*
*/
private static final long serialVersionUID = 1L;
private SsSysIpFilterId id;
public SsSysIpFilter(SsSysIpFilterId id)
{
super();
this.id = id;
}
public SsSysIpFilter()
{
super();
}
public SsSysIpFilterId getId()
{
return id;
}
public void setId(SsSysIpFilterId id)
{
this.id = id;
}
}
public class SsSysIpFilterId implements Serializable
{
/**
*
*/
private static final long serialVersionUID = 1L;
private String ipFrom;//IP段起始
private String ipTo;//IP段结束
private long ipFromNumber;//起始IP转成的数字
private long ipToNumber;//结束IP转成的数字
/**
* 转换规则
* 10.1.1.1
* 转:10*256*256*256+1*256*256+1*256+1
* 相关于转成256进制的数
*/
private boolean ipFilteType;//0为黑名单,1为白名单
public SsSysIpFilterId(String ipFrom, String ipTo, long ipFromNumber,
long ipToNumber, boolean ipFilteType)
{
super();
this.ipFrom = ipFrom;
this.ipTo = ipTo;
this.ipFromNumber = ipFromNumber;
this.ipToNumber = ipToNumber;
this.ipFilteType = ipFilteType;
}
public SsSysIpFilterId()
{
super();
}
public String getIpFrom()
{
return ipFrom;
}
public void setIpFrom(String ipFrom)
{
this.ipFrom = ipFrom;
}
public String getIpTo()
{
return ipTo;
}
public void setIpTo(String ipTo)
{
this.ipTo = ipTo;
}
public long getIpFromNumber()
{
return ipFromNumber;
}
public void setIpFromNumber(long ipFromNumber)
{
this.ipFromNumber = ipFromNumber;
}
public long getIpToNumber()
{
return ipToNumber;
}
public void setIpToNumber(long ipToNumber)
{
this.ipToNumber = ipToNumber;
}
public boolean isIpFilteType()
{
return ipFilteType;
}
public void setIpFilteType(boolean ipFilteType)
{
this.ipFilteType = ipFilteType;
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + (ipFilteType ? 1231 : 1237);
result = prime * result + ((ipFrom == null) ? 0 : ipFrom.hashCode());
result = prime * result + (int) (ipFromNumber ^ (ipFromNumber >>> 32));
result = prime * result + ((ipTo == null) ? 0 : ipTo.hashCode());
result = prime * result + (int) (ipToNumber ^ (ipToNumber >>> 32));
return result;
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final SsSysIpFilterId other = (SsSysIpFilterId) obj;
if (ipFilteType != other.ipFilteType)
return false;
if (ipFrom == null)
{
if (other.ipFrom != null)
return false;
} else if (!ipFrom.equals(other.ipFrom))
return false;
if (ipFromNumber != other.ipFromNumber)
return false;
if (ipTo == null)
{
if (other.ipTo != null)
return false;
} else if (!ipTo.equals(other.ipTo))
return false;
if (ipToNumber != other.ipToNumber)
return false;
return true;
}
}
<hibernate-mapping>
<class name="com.vixtel.model.SsSysIpFilter" table="SS_SYS_IP_FILTER">
<composite-id name="id" class="com.vixtel.model.SsSysIpFilterId">
<key-property name="ipFrom" type="java.lang.String">
<column name="IP_FROM" precision="100" scale="0" />
</key-property>
<key-property name="ipTo" type="java.lang.String">
<column name="IP_TO" precision="100" scale="0" />
</key-property>
<key-property name="ipFromNumber" type="java.lang.Long">
<column name="IP_FROM_L" precision="10" scale="0" />
</key-property>
<key-property name="ipToNumber" type="java.lang.Long">
<column name="IP_TO_L" precision="10" scale="0" />
</key-property>
<key-property name="ipFilteType" type="java.lang.Boolean">
<column name="FILTER_TYPE" precision="1" scale="0" />
</key-property>
</composite-id>
</class>
</hibernate-mapping>
应该是很标准的无主键表的配置了,担心其会调用equals方法来判断对象是否变化,就将它加上了,结果更新还是失败
SsSysIpFilter ssSysIpFilter = (SsSysIpFilter)list.get(0);
SsSysIpFilterId id = ssSysIpFilter.getId();
id.setIpFrom(new_ipFrom);
id.setIpTo(new_ipTo);
id.setIpFromNumber(new_ipFromNumber);
id.setIpToNumber(new_ipToNumber);
id.setIpFilteType(ipFilteType_new);
hibernateTemplate.update(ssSysIpFilter);
只能看到select语句,根本看不到update语句出来,估计hibernate无法判断无主键表的信息是否发生了变化.
public void deleteSsSysIpFilter(String ipFrom ,String ipTo){
List list = hibernateTemplate.find("from SsSysIpFilter s where s.id.ipFrom = '"+ipFrom+"' and s.id.ipTo ='"+ipTo+"'");
if(list.size()>0){
hibernateTemplate.delete((SsSysIpFilter)list.get(0));
}
}
public void addSsSysIpFilter(SsSysIpFilter ipFilter){
hibernateTemplate.save(ipFilter);
}
添加删除都没问题
分享到:
相关推荐
3. **实体类设计**:讲解如何创建一个Java类作为数据库表的映射,包括使用`@Entity`注解标记实体类,`@Id`注解定义主键,以及其他字段的注解如`@Column`。 4. **XML映射文件**:解释Hibernate的Hibernate ...
1. **创建实体类**:在Java中,定义一个实体类,比如`User.java`,并使用`@Entity`注解标记这个类为Hibernate管理的实体。例如: ```java import javax.persistence.Entity; import javax.persistence....
2. **实体类与表映射**:使用@Entity注解标记Java类为实体类,并通过@Id指定主键。字段可以通过@Column注解映射到数据库表的列。 3. **SessionFactory的创建**:根据配置文件初始化SessionFactory,它是线程安全的...
`.hbm.xml` 文件是 Hibernate 的对象-关系映射文件,它定义了实体类和数据库表之间的详细映射规则,包括字段类型、长度、主键生成策略等。例如: ```xml <hibernate-mapping package="com.example"> ...
@Id用于标记主键字段,@GeneratedValue可以自动生成主键值。此外,@ManyToOne、@OneToMany、@OneToOne和@ManyToMany等注解用于处理关联关系。 **第四部分:Hibernate复合主键** 复合主键在数据库设计中并不罕见,...
主键是数据库表中唯一标识一条记录的字段,对应到Java实体上,通常用`@Id`注解标记。Hibernate支持多种主键策略,如自增主键、联合主键等。 5. **持久化(Persistence)**: Hibernate提供了四种持久化操作:CRUD...
2. **实体类(Entity)**:在Hibernate中,我们通过创建Java类来代表数据库中的表,并使用注解(如@Entity, @Table)来标记这个类为数据库实体。同时,类的属性对应于表的字段,使用@Column注解进行映射。 3. **...
3. **创建实体类**:定义一个Java类,代表数据库中的表,使用`@Entity`注解标记为实体类,字段对应表的列,用`@Id`指定主键。 4. **映射配置**:如果选择使用注解,直接在实体类上进行;若使用XML映射,创建对应的`...
如name用于指定列名,unique用于设置唯一性约束,nullable定义是否允许空值,insertable和updatable控制列在INSERT和UPDATE语句中的行为,columnDefinition允许自定义SQL DDL片段,table指定对应表,length定义列...
- `@Entity`:标记一个Java类为数据库中的一个实体表,相当于传统的Hibernate配置文件中的映射文件。 - `@Table`:用于指定实体类对应的数据库表名,可以设置其他如schema、catalog等属性。 - `@Id`:标识类的...
使用注解如`@Entity`声明这是一个数据库实体,`@Table`指定对应的表名,`@Column`标记类的属性为表的字段。 3. **属性映射**:在实体类的属性上添加`@Column`注解,指定列名、是否为主键、长度、是否允许为空等属性...
Hibernate通过@Entity注解标记Java类为数据库表的映射,@Table定义表名,@Id指定主键,@GeneratedValue管理主键生成策略。其他如@Column、@OneToMany、@ManyToOne等注解则用于定义字段映射关系。 四、缓存机制 ...
3. **实体类(Entity)**:在Hibernate中,实体类代表数据库表,其属性对应于表的列。每个实体类需要继承Hibernate的`Serializable`接口,并使用`@Entity`注解标记。 4. **主键(Primary Key)**:每个实体类通常有...
Hibernate Annotation提供了一系列预定义的注解,如@Entity、@Table、@Id等,它们用于标记实体类、映射表以及主键。例如,`@Entity`表示该类为一个数据库实体,`@Table`指定对应的数据库表名,`@Id`则标识类中的...
通过@Entity注解标记Java类为实体类,@Table注解指定对应的数据库表,@Id注解标识主键,其他字段可以通过@Column注解进行字段映射。还可以使用@ManyToOne、@OneToMany、@OneToOne、@ManyToMany等注解定义关联关系。 ...
Hibernate通过@Entity注解标记一个Java类为实体类,对应数据库中的一个表。类的属性与表的列建立映射,@Id注解标识主键,其他字段如@IdClass、@GeneratedValue等可以用来定义主键生成策略。 4. **会话工厂与会话**...
例如,使用`@Entity`注解标记一个Java类为实体,用`@Id`注解指定主键字段,`@Column`注解指定字段与数据库列的映射。 六、持久化操作 1. 保存(Save/Insert):通过Session的save()或persist()方法将新对象插入...
Hibernate,作为Java中广泛使用的对象关系映射(ORM)框架,提供了多种方式来处理继承关系的映射,其中一种就是"每个类都对应一张表"的策略。本文将深入探讨这种映射方式,以及如何在Hibernate中实现它。 首先,...
1. 实体类:使用@Entity注解标记,@Table注解指定对应的数据库表。 2. 主键管理:@Id注解标识主键,可使用@GeneratedValue自动生成策略。 3. 属性映射:@Column注解映射字段,@ManyToOne、@OneToMany等处理关联关系...
在单表操作中,我们需要创建一个代表数据库表的Java类,并使用`@Entity`注解标记它。同时,使用`@Table`注解指定对应的数据库表名。 接着,我们会在实体类中定义属性,每个属性对应表中的字段,通过`@Column`注解来...