Java 许多关系休眠
使用Hibernate和PostgreSQL作为数据库,对SpringBoot应用程序进行建模。 需要帮助才能正确地建立许多关系。 班级新闻:Java 许多关系休眠,java,spring,postgresql,hibernate,Java,Spring,Postgresql,Hibernate,使用Hibernate和PostgreSQL作为数据库,对SpringBoot应用程序进行建模。 需要帮助才能正确地建立许多关系。 班级新闻: @Entity(name = "news") public class News implements Serializable { private Long id; private Date date; private String text; private String author; private Set
@Entity(name = "news")
public class News implements Serializable {
private Long id;
private Date date;
private String text;
private String author;
private Set<HashTag> hashTags = new HashSet<HashTag>(0);
private byte[] image;
public News() {
}
public News(Date date, String text, String author, Set<HashTag> hashTags, byte[] image) {
this.date = date;
this.text = text;
this.author = author;
this.hashTags = hashTags;
this.image = image;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "news_id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Temporal(TemporalType.DATE)
@DateTimeFormat(pattern = "DD/MM/YYYY")
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Lob
@Type(type = "org.hibernate.type.TextType")
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "news_hashTag",
joinColumns = @JoinColumn(name = "news_id"),
inverseJoinColumns = @JoinColumn(name = "hashtag_id"))
public Set<HashTag> getHashTags() {
return hashTags;
}
public void setHashTags(Set<HashTag> hashTags) {
this.hashTags = hashTags;
}
@Lob
public byte[] getImage() {
return image;
}
public void setImage(byte[] image) {
this.image = image;
}
@Entity(name=“news”)
公共类新闻实现了可序列化{
私人长id;
私人日期;
私有字符串文本;
私有字符串作者;
私有集hashTags=新HashSet(0);
私有字节[]图像;
公共新闻{
}
公共新闻(日期、字符串文本、字符串作者、设置哈希标记、字节[]图像){
this.date=日期;
this.text=文本;
this.author=作者;
this.hashTags=hashTags;
这个图像=图像;
}
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“news\u id”)
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
@时态(TemporalType.DATE)
@日期时间格式(pattern=“DD/MM/YYYY”)
公共日期getDate(){
返回日期;
}
公共作废设置日期(日期){
this.date=日期;
}
@高球
@类型(Type=“org.hibernate.Type.TextType”)
公共字符串getText(){
返回文本;
}
公共void setText(字符串文本){
this.text=文本;
}
公共字符串getAuthor(){
返回作者;
}
公共void setAuthor(字符串编写器){
this.author=作者;
}
@ManyToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
@JoinTable(name=“news\u hashTag”,
joinColumns=@JoinColumn(name=“news\u id”),
inverseJoinColumns=@JoinColumn(name=“hashtag\u id”))
公共集getHashTags(){
返回标签;
}
公共void setHashTags(设置hashTags){
this.hashTags=hashTags;
}
@高球
公共字节[]getImage(){
返回图像;
}
public void setImage(字节[]图像){
这个图像=图像;
}
和类标签:
@Entity(name = "hashTag")
public class HashTag implements Serializable {
private Long id;
private String name;
private String description;
private Set<News> news = new HashSet<News>(0);
public HashTag() {
}
public HashTag(String name, String description) {
this.name = name;
this.description = description;
}
@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
@Column(name = "hashtag_id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToMany(cascade = CascadeType.ALL, mappedBy = "hashTags")
public Set<News> getNews() {
return news;
}
public void setNews(Set<News> news) {
this.news = news;
}
@Entity(name=“hashTag”)
公共类HashTag实现可序列化{
私人长id;
私有字符串名称;
私有字符串描述;
私有集新闻=新哈希集(0);
公共标签(){
}
公共HashTag(字符串名称、字符串描述){
this.name=名称;
this.description=描述;
}
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“hashtag\u id”)
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
@ManyToMany(cascade=CascadeType.ALL,mappedBy=“hashTags”)
公共集getNews(){
返回消息;
}
公共无效设置新闻(设置新闻){
this.news=新闻;
}
当我尝试像这样保存新闻时:
Set<HashTag> hashTags = new HashSet<>();
hashTags.add(new HashTag("HashTag 1");
hashTags.add(new HashTag("HashTag 2");
News news = new News();
news.text = "Some text";
news.author = "Some author";
news.date = new Date();
news.hashTags = hashTags;
newsService.save(news);
@Id
@Column(name = "hashtag_id", nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "HashTagIDGenerator")
@SequenceGenerator(name = "HashTagIDGenerator", sequenceName = "SEQ_HASHTAG_ID")
Set hashTags=new HashSet();
添加(新标签(“标签1”);
添加(新标签(“标签2”);
新闻=新新闻();
news.text=“一些文本”;
news.author=“某作者”;
news.date=新日期();
news.hashTags=hashTags;
保存(新闻);
我得到一个错误:
错误:“news\u id”列中的null值违反了not null约束
让我们看看我们有什么:
在n-m关系的拥有方:
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "news_hashTag",
joinColumns = @JoinColumn(name = "news_id"),
inverseJoinColumns = @JoinColumn(name = "hashtag_id"))
public Set<HashTag> getHashTags() {
return hashTags;
}
玩得开心。你可以试试hashTags.forEach(h->setNews(新闻))-换句话说,给标签一个对他们的新闻对象的引用,然后填充新闻id栏。尝试过了,没有改变:/@zzheads多么混乱,问题不再是真实的。我必须将问题更改为真实的状态。首先,非常感谢您提供了这样的描述性答案。按照建议更改了所有内容,但没有更改ame错误,有关错误消息,请参阅更新我的post@zzheads等等,您问题中的更新是我更改的结果?您添加了日志信息,对吗?如果日志信息是我建议的结果,它不应该是问题的一部分。请将日志信息作为注释添加到我的答案中。好的,更改后的错误消息您建议:错误消息:WARN 48256---[nio-8080-exec-1]o.h.engine.jdbc.spi.SqlExceptionHelper:SQL错误:0,SQLState:23502 2017-02-12 13:43:24.445错误48256---[nio-8080-exec-1]o.h.engine.jdbc.spi.SqlExceptionHelper:Error:列“news\u id”中的空值违反非空约束ПППППППППППббСббббббббб107@zzheads请提供完整的错误消息。我想知道该消息,具体错误显示4列的值,但第一次插入有5列,第二次插入有3列。我认为这是一个错误,您可以尝试向hibernate报告一个错误吗?现在必须离开。更改了HashTag类-删除了“描述”属性。