2012-06-21 2 views
0

상속 된 프로젝트에서 작업 중이며 약간의 문제가 있습니다. 내 데이터베이스에는 센서 용 테이블이 있습니다. 센서는 작업이 가능하며 작업을위한 테이블이 있습니다. 나는 센서를 추가하고 제거 할 수 있습니다. 센서에 대한 작업이 완료되면 ConstraintViolationException이 발생합니다. 작업 엔티티는 센서 객체에 대한 참조를 유지하며 문제가 어딘가에 있다는 것을 확신합니다. 내 센서 DAO 객체를 사용하여 센서를 삭제하고 관련 작업을 모두 자동으로 삭제하도록 할 수 있습니다. 나는 이것을 통해 내 방식을 어지럽히고 있으며 센서 클래스에 일종의 캐스케이드 주석을 추가해야한다고 생각하지만 확실하지 않습니다. 여기에 작업 개체입니다최대 절전 모드 테이블에서 종속 레코드를 삭제하는 방법

@Entity 
@Table(name = "sensors") 
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL) 
public class Sensor { 
    @Id 
    @Column(name = "sensor_id") 
    private String sensorId; 
    @Column(name = "obs_area_wkt", length = 2048) 
    private String observableAreaWKT; 
    @Column(name = "tasking_provider") 
    private String taskingProvider; 
    @Column(name = "delivery_uri") 
    private String deliveryUri; 
    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "data_service_id") 
    private DataService dataService; 
    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "sensor_description") 
    private SensorDescription sensorDescription; 
    @Column(name = "observable_property") 
    private String observableProperty; 

과 :

@Entity 
@Table(name = "tasks") 
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL) 
public class Task {  
@Id 
    @Column(name = "task_id", length=276) 
    private String id; 

    @ManyToOne(cascade = CascadeType.ALL) 
    @Cascade(org.hibernate.annotations.CascadeType.ALL) 
    @JoinColumn(name ="sensor") 
    private Sensor sensor; 

    @Type(type = "org.joda.time.contrib.hibernate.PersistentDateTime") 
    @Column(name = "recieved") 
    private DateTime received; 

    @Type(type = "org.joda.time.contrib.hibernate.PersistentDateTime") 
    @Column(name = "executed") 
    private DateTime executed; 

    @Column(name = "command_text") 
    @Lob 
    private String commandText; 

    @Column(name = "task_parameters") 
    @Lob 
    private String taskParameters; 

    @Column(name = "status") 
    private String status; 

    @Column(name = "request_status") 
    private String requestStatus; 

    @Column(name = "user_id") 
    private String userId; 

    @Column(name = "group_id") 
    private String groupId; 

답변

2

어느 양방향 연결을 확인하고 센서 삭제할 때 센서의 작업을 remoe하는 폭포를 추가

을 여기에 내가 가진 무엇 또는
@OneToMany(mappedBy = "sensor", cascade = CacsadeType.REMOVE) 
private Set<Task> tasks; 

, 센서를 삭제하기 전에, 모든 작업을 검색 먼저 삭제 :

List<Task> tasks = 
    session.createQuery("select task from Task task where task.sensor = :sensor") 
      .setParameter("sensor", sensor) 
      .list(); 
for (Task task : tasks) { 
    session.delete(task); 
} 
session.delete(sensor); 

ManyToOne을 센서로 설정하면 cascade = ALL으로 설정해도 감지 할 수 없으므로 작업 중 하나를 삭제할 때 센서를 삭제하지 않으려합니다.

+0

당신은 남자입니다 :) – Bal

관련 문제