java 实体类 代码重复_java – JPA两个单向@OneToMany关系到同一个实体导致重复输入...
我目前正在開展一個學(xué)校項目,我們必須創(chuàng)建自己的“Twitter”應(yīng)用程序,并且我在域?qū)ο蟮某志眯苑矫嬗龅搅艘恍┞闊?
我的帳戶類(為便于閱讀而簡化):
@Entity
public class Account implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@Column(unique = true)
private String email;
@OneToMany
private final List following = new ArrayList<>();
@OneToMany(mappedBy = "tweetedBy", cascade = ALL)
private final List tweets = new ArrayList<>();
我的推文類(為便于閱讀而簡化):
@Entity
public class Tweet implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String content;
@ManyToOne
private Account tweetedBy;
@OneToMany(cascade = CascadeType.PERSIST)
@JoinTable(name = "tweet_likes")
private final List likedBy = new ArrayList<>();
@OneToMany(cascade = CascadeType.PERSIST)
@JoinTable(name = "tweet_mentions")
private final List mentions = new ArrayList<>();
持久代碼(簡化):
Account a1 = new Account("user1@gmail.com", "password1");
Account a2 = new Account("user2@gmail.com", "password2");
Account a3 = new Account("user3@gmail.com", "password3");
a1.addTweet("Sup mah dudes.");
a1.addTweet("yoyo");
a2.addTweet("Allo Allo #tweeting");
a2.addTweet("#testing yoyo");
a1.getTweets().get(0).addLike(a3);
a1.addFollowing(a3);
em.persist(a1);
em.persist(a2);
em.persist(a3);
我遇到的問題是,LikeBy和提及沒有正確持久化.正在生成鏈接器表并插入數(shù)據(jù),但我在插入用戶時不斷出現(xiàn)重復(fù)的條目錯誤.我相信我正確地建立了關(guān)系(單向OneToMany),因為我不希望帳戶跟蹤它所提到的推文.
我嘗試過的:
> @JoinColumn用于喜歡和提及(導(dǎo)致重復(fù)插入)
>對于喜歡和提及的@JoinTable(導(dǎo)致重復(fù)插入)
>只有@OneToMany用于喜歡和提及(這不會導(dǎo)致錯誤,但會為兩個關(guān)系創(chuàng)建一個鏈接器表,其中任何一個都不能為null)
> @OneToMany for likes,然后@joinColumn提及nullable = true(這導(dǎo)致你不能在推文中提及你的情況,除非你喜歡它,這是奇怪的行為)
> @OneToMany(cascade = CascadeType.MERGE)(導(dǎo)致重復(fù)插入)
Netbeans輸出的重復(fù)插入錯誤:
Warning: Local Exception Stack:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.4.qualifier): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'user6@gmail.com' for key 'EMAIL'
Error Code: 1062
Call: INSERT INTO ACCOUNT (AVATARPATH, BIO, EMAIL, ENCRYPTEDPASSWORD, LOCATION, USERNAME, USERROLE, WEBSITE) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
bind => [8 parameters bound]
Query: InsertObjectQuery(domain.Account@3c7f9d54)
我相信這個錯誤的發(fā)生是因為我的JPA imlementation的流程如下:
>帳戶持續(xù)存在
>推文持續(xù)存在(因為它在賬戶內(nèi))
>帳戶持續(xù)存在(因為它在Tweet內(nèi))< - 重復(fù)條目
我期待的是:
> 1個鏈接表,其中包含tweet_id(fk)和表示喜歡的account_id(fk)
> 1個鏈接表,其中包含tweet_id(fk)和表示提及的account_id(fk)
如果有人可以幫我解釋注釋或者解釋我做錯了什么,那將非常感激.
Ty提前獲得任何幫助.
總結(jié)
以上是生活随笔為你收集整理的java 实体类 代码重复_java – JPA两个单向@OneToMany关系到同一个实体导致重复输入...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 命令行编译java项目_命令行编译运行j
- 下一篇: 关于指针释放的小领悟