Это ужасный дизайн, и я его не рекомендую (вы должны просто создать другую таблицу), но это возможно.
Сначала вам нужно будет использовать атрибут byte[]
для хранения сериализованной версии списка лиц, которые будут храниться в BLOB в базе данных. Так что аннотируйте его getter с @Lob
(я бы сделал getter и setter private
, чтобы не выставлять их). Затем выведите «fake» getter и setter для возврата или установите List
из byte[]
. Я использую SerializationUtils
из Commons Lang в приведенном ниже примере (предоставит вам собственный вспомогательный класс, если вы не хотите импортировать эту библиотеку) для сериализации / десериализации на лету в / из byte[]
. Не забудьте отметить «фальшивый» геттер с помощью @Transcient
или Hibernate попытается создать поле (и сбой, потому что он не сможет определить тип для List
).
@Entity(name = "family")
class Family implements Serializable {
// ...
private byte[] familyMembersAsByteArray;
public Family() {}
@Lob
@Column(name = "members", length = Integer.MAX_VALUE - 1)
private byte[] getFamilyMembersAsByteArray() { // not exposed
return familyMembersAsByteArray;
}
private void setFamilyMembersAsByteArray((byte[] familyMembersAsByteArray() { // not exposed
this.familyMembersAsByteArray = familyMembersAsByteArray;
}
@Transient
public List getFamilyMembers() {
return (List) SerializationUtils.deserialize(familyMembersAsByteArray);
}
public void setParticipants(List familyMembers) {
this.familyMembersAsByteArray = SerializationUtils.serialize((Serializable) familyMembers);
}
}
Не забудьте сделать класс Person
Serializable
и добавить реальный serialVersionUID
(я просто показываю по умолчанию здесь):
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
// ...
private String firstName, lastName;
private int age;
}
Но пусть пусть я настаиваю, это ужасный дизайн, и он будет очень хрупким (изменение Person
может потребовать «переноса» содержимого BLOB, чтобы избежать проблем десериализации, и это станет болезненным. Вы действительно должны пересмотреть эту идею и использовать другую таблицу вместо Person
(или я не понимаю, почему вы используете базу данных).
Начиная с jQuery 1.8, данные о событиях больше не доступны из "общедоступных" API »для данных. Прочтите это сообщение блога jQuery . Вместо этого вы должны использовать это:
jQuery._data( elem, "events" );
elem
должен быть элементом HTML, а не объектом jQuery или селектором.
Обратите внимание, что это внутренняя, «частная» структура, и ее не следует изменять. Используйте это только для целей отладки.
В более старых версиях jQuery вам, возможно, придется использовать старый метод:
jQuery( elem ).data( "events" );
Я объединил некоторые ответы выше и создал этот сумасшедший взгляд, но функциональный сценарий, который перечисляет, надо надеяться, большинство слушателей события на данном элементе. Не стесняйтесь оптимизировать его здесь.
var element = $("#some-element");
// sample event handlers
element.on("mouseover", function () {
alert("foo");
});
$(".parent-element").on("mousedown", "span", function () {
alert("bar");
});
$(document).on("click", "span", function () {
alert("xyz");
});
var collection = element.parents()
.add(element)
.add($(document));
collection.each(function() {
var currentEl = $(this) ? $(this) : $(document);
var tagName = $(this)[0].tagName ? $(this)[0].tagName : "DOCUMENT";
var events = $._data($(this)[0], "events");
var isItself = $(this)[0] === element[0]
if (!events) return;
$.each(events, function(i, event) {
if (!event) return;
$.each(event, function(j, h) {
var found = false;
if (h.selector && h.selector.length > 0) {
currentEl.find(h.selector).each(function () {
if ($(this)[0] === element[0]) {
found = true;
}
});
} else if (!h.selector && isItself) {
found = true;
}
if (found) {
console.log("################ " + tagName);
console.log("event: " + i);
console.log("selector: '" + h.selector + "'");
console.log(h.handler);
}
});
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="parent-element">
<span id="some-element"></span>
</div>
Вы можете сделать это путем сканирования событий (начиная с jQuery 1.8+), например:
$.each($._data($("#id")[0], "events"), function(i, event) {
// i is the event type, like "click"
$.each(event, function(j, h) {
// h.handler is the function being called
});
});
Вот пример, с которым вы можете поиграть:
$ (function () {$ ("# el ") .click (function () {alert (" click ");}); $ (" # el "). mouseover (function () {alert (" mouseover ");}); $ .each ($ ._ data ($ ("# el") [0], "events"), function (i, event) {output (i); $ .each (event, function (j, h) {output ("-" + h. обработчик);});});}); функция output (текст) {$ ("# output"). html (function (i, h) {return h + text + "
";}); }
Тест < / div>