gpt4 book ai didi

java - 如何知道子实体的生成字段? ORM 是否保留子元素顺序?

转载 作者:行者123 更新时间:2023-12-01 10:36:57 25 4
gpt4 key购买 nike

我有一个 User 实体和一个 Action 实体。每个用户可以有多个操作,因此这是一对多的关系。我已将其获取类型定义为 FetchType.EAGER,因此为了添加子记录,我需要将其添加到父实体并保存。

现在子记录的生成id怎么样,如何知道它?我可以确定新的子实例位于子列表的末尾吗?

public long addNewAction(User user, String descr) {

Action action = new Action();
action.setLocatDate( LocalDate.now() );
action.setLocalTime( LocalTime.now() );
action.setUser( user );
action.setDescription( descr );

user.getActions().add( action );
userRepository.save(user);

long addedId = user.getActions().get( user.getActions().size()-1 ).getId();

return addedId;
}

实体描述如下:

@Entity
@Table(name = "USER")
public class User {

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
@Column(name = "ID")
private long id;

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "user")
private List<Action> actions;

@Column(name = "SCREEN_NAME", nullable = false, unique = true)
private String screenName;

}


@Entity
@Table(
name = "ACTION",
uniqueConstraints=@UniqueConstraint(columnNames = {"USER_ID", "LOCAL_DATE", "LOCAL_TIME"}))
@JsonDeserialize(using = MealDeserializer.class)
public class Action {

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
@Column(name = "ID")
private long id;

@ManyToOne
@JoinColumn(name="USER_ID")
private User user;

@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDate")
@Column(name = "LOCAL_DATE")
private LocalDate localDate;

@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalTime")
@Column(name = "LOCAL_TIME")
private LocalTime localTime;

@Column(name = "DESCR")
private String description;

}

如何实现?

最佳答案

持久化对象图时,实体管理器不会对列表元素重新排序 - 实体会就地修改并由实体管理器设置其 ID。这就是为什么 em.persist(entity) 返回 void - 它对给定实体进行操作并且不返回新实体(与 em.merge() 相反) )。因此,无论列表中的顺序如何,调用 save() 后都会保留它。

这不适用于从数据库进行的后续获取(使用不同的实体管理器实例/不同的事务) - 列表中实体的顺序取决于数据库顺序,但尚未确定。您可以使用@OrderColumn注释(需要数据库中的额外列)以使列表的元素保持一致的顺序。

关于java - 如何知道子实体的生成字段? ORM 是否保留子元素顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34635196/

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