擁有這個物體:
User.java:
@Entity
@NoArgsConstructor
@Getter
@Setter[/span
public class User{
@Id @GeneratedValue
private Long id。
private String username;
@OneToMany(mappedBy = "owner", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@MapKey(name = "friend_id")
private Map<User, Friendship> friends = new HashMap<>()。
}
Friendship.java:
@Entity
@Data
@IdClass(Friendship.class)
public class Friendship implements Serializable {
@Id @Id
private Long owner_id;
@Id private Long owner_id; @Id
私有Long friend_id。
private String level;
@ManyToOne(cascade = CascadeType.ALL)
@MapsId(" owner_id")
private User owner;
@ManyToOne(cascade = CascadeType.ALL)
@MapsId("friend_id"/span>)
private User friend。
}
和DemoApplication.java:
@Bean
public CommandLineRunner loadData(UserRepository userRepo){
return new CommandLineRunner() {
@Override
public void run(String... args) throws Exception {
User owner = new User() 。
owner.setUsername("所有者")。
User f1 = new User() 。
f1.setUsername("f1"/span>)。
User f2 = new User()。
f2.setUsername("f2"/span>)。
Friendship fs1 = new Friendship()。
fs1.setOwner(owner)。
fs1.setFriend(f1)。
Friendship fs2 = new Friendship()。
fs2.setOwner(owner)。
fs2.setFriend(f2)。
owner.getFriends().put(f1, fs1)。
owner.getFriends().put(f2, fs2)。
userRepo.saveAndFlush(所有者)。
}
};
}
我得到的錯誤是:
A不同的object with the same 識別符號 值 是 已經 關聯 與 the session 。[com. example.demo.model。 Friendship#Friendship(owner_id=null, friend_id=null, level=null, owner=com. example.demo.model.User@2b036135, friend=com.example.demo.model.User@a9e28af9) ]
這意味著User的f1和f2,在Long id中都是空的。確實有,當物件被創建時,但我認為映射已經指定了CascadeType.ALL和@GeneratedValue所以if應該被創建。
但我曾嘗試自己設定id:
...
f1.setUsername("f1")。
f1.setId(1L)。
User f2 = new User()。
f2.setUsername("f2")。
f2.setId(2L)。
...
但現在我得到了
detached entity passed to persist: com.example.demo.model.user
所以我想我應該讓JPA上的主鍵的創建。但正如你在上面所看到的,即使使用層疊式,它也不會這樣做。那么現在怎么辦?
uj5u.com熱心網友回復:
在你的User物體中@Id @GeneratedValue創建了帶有Primary key的列,但是沒有帶有Auto Increment,當你在id列中手動插入資料時,產生錯誤,因為它是Primary key...
改變:
@Id @GeneratedValue
致:
@Id @GeneratedValue(策略 = GenerationType.IDENTITY
用于自動遞增
uj5u.com熱心網友回復:
嘗試在你的@Id注解下添加這個
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/307775.html
標籤:
上一篇:用Hibernate自動改變資料
