2015-03-04 2 views
0

У меня есть класс работы, как в следующемHibernate ManyToOne ссылается на объект со столбцом (unique = true)?

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
public int getId() { 
    return Id; 
} 
public void setId(int id) { 
    Id = id; 
} 

@ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.PERSIST) 
@NotNull 
@JoinColumn(name="job_type_id") 
public JobType getJobType() { 
    return jobType; 
} 

public void setJobType(JobType jobType) { 
    this.jobType = jobType; 
} 

@ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.PERSIST) 
@NotNull 
@JoinColumn(name="job_status_id") 
public JobStatus getJobStatus() { 
    return jobStatus; 
} 
public void setJobStatus(JobStatus jobStatus) { 
    this.jobStatus = jobStatus; 
} 


@Column(name="priority",nullable=false) 
public int getPriority() { 
    return priority; 
} 
public void setPriority(int priority) { 
    this.priority = priority; 
} 

@ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.PERSIST) 
@NotNull 
@JoinColumn(name="applliaction_id") 
public Application getApplication() { 
    return application; 
} 
public void setApplication(Application application) { 
    this.application = application; 
} 

}

и класс JobStatus подобен

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
public int getId() { 
    return id; 
} 
public void setId(int id) { 
    this.id = id; 
} 

@Column(name="name",nullable =false, unique=true, length=50) 
public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 

@Column(name="description",columnDefinition = "text") 
public String getDescription() { 
    return description; 
} 
public void setDescription(String description) { 
    this.description = description; 
} 

и JobType класс как

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

@Column(name="name", unique=true, nullable=false,length=20) 
public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 

@Column(name="description",columnDefinition = "text") 
public String getDescription() { 
    return description; 
} 
public void setDescription(String description) { 
    this.description = description; 
} 

и класс приложений, как

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
public int getId() { 
    return id; 
} 
public void setId(int id) { 
    this.id = id; 
} 

@Column(name="name",nullable=false,unique =true, length=50) 
public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 

@Column(name="current_version",nullable=false,length=50) 
public String getCurretnVersion() { 
    return curretnVersion; 
} 
public void setCurretnVersion(String curretnVersion) { 
    this.curretnVersion = curretnVersion; 
} 

@Column(name="updated_at",nullable=false) 
public Date getUpdatedAt() { 
    return updatedAt; 
} 
public void setUpdatedAt(Date updatedAt) { 
    this.updatedAt = updatedAt; 
} 

@Column(name="created_at",nullable=false) 
public Date getCreatedAt() { 
    return createdAt; 
} 
public void setCreatedAt(Date createdAt) { 
    this.createdAt = createdAt; 
} 
@Column(name="description",columnDefinition = "text") 
public String getDescription() { 
    return description; 
} 
public void setDescription(String description) { 
    this.description = description; 
} 

И главный метод подобен

public static void main(String[] args) { 
    System.out.println((new SimpleDateFormat("HH:mm:ss:SSS")).format(new Date()));  
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    System.out.println((new SimpleDateFormat("HH:mm:ss:SSS")).format(new Date())); 

    //Application 
    Application app = new Application(); 
    app.setName("GW"); 
    app.setCreatedAt(new Date()); 
    app.setUpdatedAt(new Date()); 
    app.setCurretnVersion("1.0"); 

    //Job Type 
    JobType jType = new JobType(); 
    jType.setDescription("new type"); 
    jType.setName("banboo"); 

    //Job Status 
    JobStatus js = new JobStatus(); 
    js.setName("waiting"); 


    //first job 
    Job job1 = new Job(); 
    job1.setPriority(3);   
    job1.setApplication(app); 
    job1.setJobType(jType); 
    job1.setJobStatus(js); 

    //Second Job 
    Job job2 = new Job(); 
    job2.setPriority(3); 
    job2.setApplication(app); 
    job2.setJobStatus(js); 
    job2.setJobType(jType); 

    Transaction tx = session.beginTransaction(); 
    session.save(job1); 
    session.save(job2); 
    session.save(jType); 
    session.save(js); 
    session.save(app); 
    tx.commit(); 
    session.close(); 
    System.out.println((new SimpleDateFormat("HH:mm:ss:SSS")).format(new Date())); 
} 

Первый раз, когда я побежал главный ОК. Но когда я повторю это. Появилась следующая ошибка. Значение дублирующегося ключа нарушает единственное ограничение «uk_jidxac21t4vg1tmees14dwyo1» Деталь: Ключ (имя) = (banboo) уже существует.

как решить проблему?

Спасибо,

Скотт

Редактировать программу и вопрос JB Nizet предложил.

ответ

0

Вы сказали Hibernate, что ассоциация является OneToOne.

Это означает, что только одно Иов может ссылаться на данный JobStatus и что только один JobStatus может ссылаться на задание Job.

Если вы хотите, чтобы многие задания делились одним JobStatus, вам нужен ManyToOne.

+0

Спасибо за ваш ответ. Но после того, как я перешел на ManyToOne, у меня была почти такая же проблема. Проблема заключается в уникальном = true в JobStatus. Некоторые, как программа пытается ввести один и тот же JobStatus два раза. – Scott

+0

Если вы хотите, чтобы задание ссылалось на уже существующий JobStatus, вам нужно получить этот JobStatus из базы данных (по идентификатору, используя session.get() или session.load() или по другому критерию, используя запрос). Вы не можете просто создать новый JobStatus с тем же именем, что и существующий, и надейтесь, что Hibernate волшебным образом найдет существующий статус задания, имеющий это имя, и установите его в задание для вас. –

Смежные вопросы