【问题标题】:Retrieve entity auto generated Id检索实体自动生成的 Id
【发布时间】:2013-03-13 14:41:08
【问题描述】:

我正在尝试找到一种方法来检索通过级联持久保存在数据库中的实体的自动生成 ID。我正在使用 Hibernate 4.1.9、Spring 数据 1.2 和 Spring 框架 3.2.1。以下是有问题的实体:位置、家庭、房间。

位置父类

@Entity
@Table(name = "location")
@Inheritance(strategy = InheritanceType.JOINED)
public class Location implements Serializable
{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "location_id", unique = true)
private long uuid;

// other attributes and methods not relevant
}

Home 类扩展了一个 Location,引用了一组房间

@Entity
@Table(name = "home")
@Inheritance(strategy = InheritanceType.JOINED)
@PrimaryKeyJoinColumn(name = "home_id")
public class Home extends Location implements Serializable
{

@OneToMany(mappedBy = "containingHome", cascade = {CascadeType.ALL}, orphanRemoval = true)
private Set<Room> rooms;
// other attributes and methods not relevant
}

最后是引用 Home 对象的 Room 类

@Entity
@Table(name = "room")
@PrimaryKeyJoinColumn(name = "room_id")
public class Room extends Location implements Serializable
{

@ManyToOne()
@JoinColumn(name = "home_id")
protected Home containingHome;
// other attributes and methods not relevant
}

我正在使用 Spring 数据为实体创建存储库。

位置存储库

public interface LocationRepository extends JpaRepository<Location, Long>
{ }

我遇到的问题是我需要 id 以便能够从数据库中检索不同的对象,并且它是自动生成的。我可以通过元素访问 id 的唯一方法是在将托管对象保存到数据库时获取它。但是,如果我尝试像这样依次保存每个位置:

Home home = new Home();
home = locationService.save(home) // service that just calls locationRepository.save method
Room bedroom = new Room(home);
bedroom = locationService.save(bedroom);

我在数据库中得到一个重复的房间条目,我认为这与 Hibernate 问题 https://hibernate.onjira.com/browse/HHH-7404 有关。如果我只是打电话

Home home = new Home();
Room bedroom = new Room(home);
locationService.save(home) 

没有双打,但我无法检索房间对象,因为它在级联上持续存在并且它的 id 为 0。有没有办法解决这个问题而无需在该位置引入其他字段,例如我拥有的唯一名称生成自己?非常感谢任何帮助。

编辑

如果在最后一种情况下我有home = locationService.save(home) 然后调用home.getUuid() 我得到正确的值,我认为这是正常的,因为我检索了一个托管对象。但是如果我这样做 bedroom.getUuid() 我得到 0,因为卧室没有被管理,所以它的 id 字段没有用数据库中的值更新。

【问题讨论】:

    标签: spring hibernate jpa spring-data


    【解决方案1】:

    您是否尝试在持久调用之后调用home.getUuid();(假设您有该字段的吸气剂)?

    您可能会感到惊讶,但 Hibernate(和 JPA)会使用 id 更新内存中的副本。

    【讨论】:

    • 我编辑了我的问题,问题是我不知道如何正确检索房间对象 ID。
    • 所以真正的问题是,当封闭的家是时,房间并没有得到持久化,对吗?
    • 如果我进行 SQL 查询,我可以看到数据库表中的 home 和 room 条目设置正确,但代码中的卧室对象被视为未保存的临时实例。那么这意味着当家在时,卧室对象没有添加到PersistenceContext中?如果这是否可以预期,我有点困惑。
    • 我认为当对象像这样松散耦合时,这是预期的行为。我更像是一个 OpenJPA 人,但应该有类似 EntityManager.merge(bedroom) 的调用来管理和重新加载对象。
    • 我实际上确实创建了一个自定义存储库,其中包含一个合并位置对象的方法,但是调用它会在数据库中引入一个具有不同 ID 的新对象。我想我唯一的选择是引入一个我自己设置的独特字段,这会使自动生成的 id 毫无意义。无论如何,感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 2014-12-12
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    相关资源
    最近更新 更多