gpt4 book ai didi

java - hibernate 注释 - 使用 @MappedSuperclass 继承 - 值未设置为基类字段 - 奇怪的错误

转载 作者:行者123 更新时间:2023-12-01 15:20:03 30 4
gpt4 key购买 nike

我正在关注Hibernate: Use a Base Class to Map Common Fieldsopenjpa inheritance tutorial将 ID、lastModifiedDate 等常见列放入基表中。

我的带注释的映射如下:

基表:

@MappedSuperclass
public abstract class BaseTable {
@Id
@GeneratedValue
@Column(name = "id")
private int id;

@Column(name = "lastmodifieddate")
private Date lastModifiedDate;
...

人员表 -

    @Entity
@Table(name = "Person ")
public class Person extends BaseTable implements Serializable{

@Column(name = "name")
private String name;
...

生成创建语句:

create table Person (id integer not null auto_increment,  lastmodifieddate datetime, name varchar(255), primary key (id)) ; 

将 Person 对象保存到数据库后,

Person p = new Person();
p.setName("Test");
p.setLastModifiedDate(new Date());
..

getSession().save(p);

我正在设置日期字段,但它正在使用生成的 ID 和 LastModifiedDate = null 以及 Name="Test"保存记录。

插入语句:

insert into Person (lastmodifieddate, name) values (?, ?)
binding parameter [1] as [TIMESTAMP] - <null>
binding parameter [2] as [VARCHAR] - Test

按 ID 查询读取:当我执行下面的 hibernate 查询(按 ID 获取)时,它会按给定 ID 读取人员。

Criteria c = getSession().createCriteria(Person.class);
c.add(Restrictions.eq("id", id));
Person person= c.list().get(0);
//person has generated ID, LastModifiedDate is null

select query select person0_.id as id8_, person0_.lastmodifieddate as lastmodi8_, person0_.name as name8_ from Person person0_
- Found [1] as column [id8_]
- Found [null] as column [lastmodi8_]
- Found [Test] as column [name8_ ]

读取全部查询:

Query query = getSession().createQuery("from " + Person.class.getName());
List<Person> allPersons=query.list();

全部读取对应的SQL

select query select person0_.id as id8_,  person0_.lastmodifieddate as lastmodi8_, person0_.name as name8_ from Person person0_
- Found [1] as column [id8_]
- Found [null] as column [lastmodi8_]
- Found [Test] as column [name8_ ]
- Found [2] as column [id8_]
- Found [null] as column [lastmodi8_]
- Found [Test2] as column [name8_ ]

但是当我在控制台中打印出列表时,它变得更奇怪了。它正在选择 Person 对象列表

  • ID 字段 = 全 0(为什么全 0?)
  • 最后修改日期 = null
  • 名称字段具有有效值

我不知道这里出了什么问题。可以请您看一下吗?

仅供引用,

我的 Hibernate 核心版本:4.1.2,MySQL 连接器版本:5.1.9。

总的来说,这里有两个问题

  • 为什么我在使用“全部读取”时得到“所有 ID 字段 =0”?
  • 为什么没有插入 LastModifiedDate?

最佳答案

使用

@Temporal(TemporalType.DATE)  

日期上的注释

对于 ID 生成使用策略。

@GeneratedValue(strategy=GenerationType.AUTO) 

@GeneratedValue(strategy=GenerationType.IDENTITY) 

或使用序列

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "custom_generator")
@SequenceGenerator(name = "custom_generator", sequenceName = "sequance_table")

您还可以在子类中进行属性访问:

public abstract class BaseTable {

protected int id;

protected Date lastModifiedDate;
// ...
}

@Entity
@Table(name = "Person")
public class Person extends BaseTable implements Serializable{

@Id
@GeneratedValue
@Column(name = "id")
public getId()
{
return super.id;
}

setId(log id)
{
super.id = id;
}

@Column(name = "lastmodifieddate")
@Temporal(TemporalType.DATE)
public getLastModifiedDate()
{
return super.lastModifiedDate;
}

setLastModifiedDate(Date date)
{
super.lastModifiedDate = date;
}

public getName()
// ...
}

关于java - hibernate 注释 - 使用 @MappedSuperclass 继承 - 值未设置为基类字段 - 奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11064986/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com