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;
4

1 に答える 1

2

関連付けを双方向にし、カスケードを追加して、センサーを削除するときにセンサーのタスクを削除します。

@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を設定しても、意味がないことに注意してください。タスクの1つを削除するときに、センサーを削除したくない場合があります。

于 2012-06-21T22:21:56.320 に答える