日期:2014-05-16  浏览次数:20585 次

Hibernate映射字段注解位置的不同造成插入数据库结果不同
如下两段hibernate实体代码:

@Entity
@Table(name = "NumberIncrement")
public class NumberIncrementModel implements Serializable {

	/**
	 * serialVersionID.
	 */
	private static final long serialVersionUID = -1555659864049096945L;

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Long id;

	@Column(name = "NUMBER_INCREMENT")
	private Integer numberIncrement;

	public NumberIncrementModel(Integer numberIncrement) {
		this.numberIncrement = numberIncrement;
	}

}



@Entity
@Table(name = "JBPM4_NUMBER_INCRECMENT")
public class NumberIncrementModel implements Serializable {

	/**
	 * serialVersionID.
	 */
	private static final long serialVersionUID = -1555659864049096945L;

	private Long id;

	public void setId(Long id) {
		this.id = id;
	}

	public void setNumberIncrement(Integer numberIncrement) {
		this.numberIncrement = numberIncrement;
	}

	private Integer numberIncrement;

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	public Long getId() {
		return id;
	}

	@Column(name = "NUMBER_INCREMENT")
	public Integer getNumberIncrement() {
		return numberIncrement + 2;
	}

	public NumberIncrementModel(Integer numberIncrement) {
		this.numberIncrement = numberIncrement;
	}

}



第一种注解放在字段上,第二种注解放在get方法上。当执行插入操作时,数据库中记录是不同的。

NumberIncrementModel numberIncrementModel = new NumberIncrementModel(2);
XXXService.insertNumberIncrecement(numberIncrementModel);


其中第一种方式插入的记录的NUMBER_INCREMENT字段值为2,第二种为4.
从这里我们可以推论出,hibernate会根据注解的位置来觉得提取实体属性的方式:是采用标准的JavaBean的get方法,还是直接采用放射。
1 楼 humaeks 2010-11-22  
请看ejb3中关于persistence的一章,里面有说明field accessor 和property accessor的区别
2 楼 oiunt 2010-11-24  
humaeks 写道
请看ejb3中关于persistence的一章,里面有说明field accessor 和property accessor的区别


谢了,看来还是要看标准的东西!