скройте конструктора без параметров на структуре

если вы хотите, чтобы и order_id, и order_line_id были составным ключом в сущности OrderLine, вам нужно сначала создать @Embeddable:

 @Embeddable
 public class OrderLinePK implements Serializable {
      private Integer orderId;
      private Integer orderLineId;
 } 

и в своей сущности OrderLine вы измените его на

 @EmbeddedId
 private OrderLinePk pk;

 @MapsId("orderId")
 @ManyToOne
 private Order order;

теперь каждый раз, когда вам нужно создать новую OrderLine, вы должны создать объект первичного ключа и назначить идентификатор следующим образом

 OrderLine orderLine = new OrderLine();
 OrderLinePK pk = new OrderLinePK();
 pk.setOrderLineId(11);
 orderLine.setPk(pk);
 orderLine.setOrder(order);

, надеюсь, это поможет.

26
задан Community 23 May 2017 в 11:46
поделиться

4 ответа

Нет, Вы не можете сделать этого. Как Вы сказали, , подобный вопрос задали, прежде - и я думал, что ответ был довольно четким, что Вы не могли сделать этого.

Вы можете создавать частного конструктора без параметров для структуры , но не в C#. Однако, даже если Вы делаете это, это действительно не помогает - потому что можно легко работать вокруг этого:

MyStruct[] tmp = new MyStruct[1];
MyStruct gotcha = tmp[0];

, Который будет значением по умолчанию MyStruct - "все обнуляет" значение - никогда не вызывая конструктора.

Вы могли легко добавить Проверить метод к своей структуре и вызову, что каждый раз Вы получили тот в качестве параметра по общему признанию.

29
ответ дан Community 28 November 2019 в 07:31
поделиться

Нет не может скрыть его. Структуры не могут переопределить нулевого конструктора аргумента, поэтому его видимость не может быть переопределена.

5
ответ дан DavidN 28 November 2019 в 07:31
поделиться

Вы не можете сделать структуру с частным конструктором без параметров или даже объявить конструктора без параметров. Необходимо было бы изменить его на класс. Структуры не, позволяют объявлять конструктора без параметров.

От эти Учебное руководство по Структурам на MSDN:

Структуры могут объявить конструкторов, но они должны взять параметры. Это - ошибка объявить конструктора (без параметров) по умолчанию для структуры. У участников структуры не может быть инициализаторов. Конструктор по умолчанию всегда предоставляется для инициализации участников структуры к их значениям по умолчанию.

От спецификация C# на MSDN:

11.3 Классов и различия в структуре

Структуры отличаются от классов несколькими важными способами:

  • Структуры являются типами значения (Раздел 11.3.1).
  • Все типы структуры неявно наследовались системе классов. ValueType (Раздел 11.3.2). Присвоение на переменную типа структуры создает копию присваиваемого значения (Раздел 11.3.3).
  • значение по умолчанию структуры является значением, произведенным путем установки всех полей типа значения на их значение по умолчанию и всех полей ссылочного типа к пустому указателю (Раздел 11.3.4). Упаковка и распаковывание операций используются для преобразования между типом структуры и объектом (Раздел 11.3.5).
  • значение этого отличается для структур (Раздел 11.3.6).
  • объявлениям Поля экземпляра для структуры не разрешают включать переменные инициализаторы (Раздел 11.3.7).
  • структуре А не разрешают объявить конструктор экземпляра без параметров (Раздел 11.3.8).
  • структуре А не разрешают объявить деструктор (Раздел 11.3.9).
2
ответ дан Ryan 28 November 2019 в 07:31
поделиться

Хорошо структура является буквально объявлением того, как память будет находиться.

, Даже когда Вы используете объект, указатель объектов объявленная IS, независимо от того, является ли это пустым.

причина, что Вы не можете скрыть конструктора, состоит в том, потому что структура требует, чтобы CLR мог создать ее как внутренне, она должна сделать это.

Вы могли преобразовать эту структуру в объект достигнуть этой задачи. Или используйте статический анализ, чтобы гарантировать, что он инициализируется перед использованием его?

struct point
{
   int xpos;
   int ypos;
}

Имеют Google для неизменных объектов, это, кажется, что Ваш после. Я полагаю, что они надеются добавлять эту опцию (но не в C# 4) на сам язык, потому что это - общее требование. Существует ли определенная потребность в структуре здесь?

2
ответ дан Spence 28 November 2019 в 07:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: