2012-06-21 57 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); 

请注意,设置cascade = ALL从任务到传感器的ManyToOne没有任何意义:您不希望在删除其中一个任务时删除传感器。

+0

你是男人:) – Bal